#include "postgres.h"
#include "executor/spi.h" /* this is what you need to work with SPI */
#include "commands/trigger.h" /* ... and triggers */
#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif

extern Datum trigf(PG_FUNCTION_ARGS);
PG_FUNCTION_INFO_V1(trigf);
Datum
trigsmsf(PG_FUNCTION_ARGS)
{
	TriggerData *trigdata = (TriggerData *) fcinfo->context;
	TupleDesc tupdesc;
	HeapTuple rettuple;
	char *when;
        char* pMobile;
	bool checknull = false;
	bool isnull;
	int ret, i;
        elog(INFO,"this is from harold");
	/* make sure it’s called as a trigger at all */
	if (!CALLED_AS_TRIGGER(fcinfo))
		elog(ERROR, "trigf: not called by trigger manager");
	/* tuple to return to executor */
	if (TRIGGER_FIRED_BY_UPDATE(trigdata->tg_event))
		rettuple = trigdata->tg_newtuple;
	else
		rettuple = trigdata->tg_trigtuple;
	/* check for null values */
	if (!TRIGGER_FIRED_BY_DELETE(trigdata->tg_event)
	&& TRIGGER_FIRED_BEFORE(trigdata->tg_event))
		checknull = true;
	if (TRIGGER_FIRED_BEFORE(trigdata->tg_event))
		when = "before";
	else
		when = "after ";
	tupdesc = trigdata->tg_relation->rd_att;
        pMobile = SPI_getvalue(rettuple,tupdesc,3);
	elog(INFO,"the mobile is %s",pMobile);
	pfree(pMobile);
	/* connect to SPI manager */
	if ((ret = SPI_connect()) < 0)
		elog(ERROR, "trigf (fired %s): SPI_connect returned %d", when, ret);
	/* get number of rows in table */
	ret = SPI_exec("SELECT count(*) FROM ttest", 0);
	if (ret < 0)
		elog(ERROR, "trigf (fired %s): SPI_exec returned %d", when, ret);
	/* count(*) returns int8, so be careful to convert */
	i = DatumGetInt64(SPI_getbinval(SPI_tuptable->vals[0],
	SPI_tuptable->tupdesc,1,&isnull));
	elog (INFO, "trigf (fired %s): there are %d rows in ttest", when, i);
	SPI_finish();
	if (checknull)
	{
		SPI_getbinval(rettuple, tupdesc, 1, &isnull);
		if (isnull)
			rettuple = NULL;
	}
	return PointerGetDatum(rettuple);
}
